home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / dev / src / Rkm_asm.lha / Assembly_Codes / OS_Sources / Handler / FunctionKeysNH.s < prev    next >
Text File  |  1992-09-02  |  4KB  |  207 lines

  1.  
  2.  * Memory Buffer addresses.
  3.  *
  4.  *  0  Startup Return Message
  5.  *  4 Task address
  6.  *  8 KILL NUMERICPAD Port
  7.  * 12 NUMERICPAD Message
  8.  * 16 pmcommand
  9.  * 18 pmaction
  10.  * 20 pmseconds
  11.  * 24 pmmicros
  12.  * 28 pmdata
  13.  * 29 pmstatus
  14.  *
  15.  
  16.     INCDIR    WORK:Include/
  17.  
  18.     INCLUDE    work:devpac/large.gs
  19.     INCLUDE    misc/missing_keys.i
  20.  
  21.     lea    membuf(pc),a4
  22.  
  23.     suba.l    a1,a1
  24.     move.l    4.w,a6
  25.     jsr    _LVOFindTask(a6)
  26.     tst.l    d0
  27.     beq    exit
  28.     move.l    d0,a5
  29.     move.l    a5,4(a4)
  30.     tst.l    pr_CLI(a5)        ; Was this task started from CLI?
  31.     bne.s    _main            ; Yes.
  32.     lea    pr_MsgPort(a5),a0    ; No. From Workbench.
  33.     jsr    _LVOWaitPort(a6)
  34.     lea    pr_MsgPort(a5),a0
  35.     jsr    _LVOGetMsg(a6)
  36.     move.l    d0,(a4)            ; D0 = A WBStartup Message.
  37.  
  38. _main
  39.  
  40.  * Set-Up a Message Port.
  41.  
  42.         jsr    _LVOForbid(a6)
  43.         lea     portname(pc),a1
  44.         jsr    _LVOFindPort(a6)
  45.         tst.l   d0
  46.     bne    exists
  47.         moveq   #MP_SIZE,d0
  48.         move.l  #MEMF_PUBLIC!MEMF_CLEAR,d1
  49.         jsr    _LVOAllocMem(a6)
  50.         move.l  d0,8(a4)
  51.         beq    no_pmem
  52.         move.l  d0,a0
  53.         clr.l    (a0)                ; LN_SUCC(a0)
  54.         clr.l    LN_PRED(a0)
  55.         move.b  #NT_MSGPORT,LN_TYPE(a0)
  56.         clr.b    LN_PRI(a0)
  57.         lea     portname(pc),a1
  58.         move.l  a1,LN_NAME(a0)
  59.         move.b  #PA_SIGNAL,MP_FLAGS(a0)
  60.         move.l  4(a4),MP_SIGTASK(a0)
  61.         moveq    #-1,d0
  62.         jsr    _LVOAllocSignal(a6)
  63.         move.b  d0,d5
  64.         cmp.l    #-1,d0
  65.         bne.s    ad_port
  66.         jsr    _LVOPermit(a6)
  67.     bra    fr_pmem
  68. ad_port    move.l    8(a4),a1
  69.         move.b  d5,MP_SIGBIT(a1)
  70.         jsr    _LVOAddPort(a6)
  71.         jsr    _LVOPermit(a6)
  72.  
  73.  * Set-Up the Message.
  74.  
  75.     moveq    #pm_SIZEOF,d0
  76.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  77.     jsr    _LVOAllocMem(a6)
  78.     move.l    d0,12(a4)
  79.     beq    free_port
  80.     move.l    d0,a0
  81.     clr.l    (a0)                ; LN_SUCC(a0)
  82.     clr.l    LN_PRED(a0)
  83.     move.b    #NT_MESSAGE,LN_TYPE(a0)
  84.     clr.b    LN_PRI(a0)
  85.     clr.l    LN_NAME(a0)
  86.     move.l    8(a4),MN_REPLYPORT(a0)
  87.     move.w    #pm_SIZEOF,MN_LENGTH(a0)
  88.  
  89.  * The start of NUMERICPAD Message data.
  90.  
  91.     move.w    #PMCOMMAND_USENUMERICPAD,pm_Command(a0)
  92.     clr.b    pm_Status(a0)
  93.  
  94.     bra.s    send_msg
  95.  
  96. exists    jsr    _LVOPermit(a6)
  97.         bra.s    quit
  98.  
  99. no_pmem    jsr    _LVOPermit(a6)
  100.         bra.s    quit
  101.  
  102. send_msg
  103.     bsr    find_port
  104.     tst.l    d2
  105.     beq.s    free_message
  106.  
  107.     move.l    d2,a0            ; `NUMERICPAD Port'
  108.     move.l    12(a4),a1
  109.     jsr    _LVOPutMsg(a6)        ; send a Message to `NUMERICPAD Port'
  110.     jsr    _LVOPermit(a6)
  111.  
  112.     bsr    get_msg
  113.  
  114.  * You do not ReplyMsg() as you (this port) initiated the Message.
  115.  
  116.     bsr    find_port
  117.     tst.l    d2
  118.     beq.s    free_message
  119.  
  120.     move.l    d2,a0            ; `NUMERICPAD Port'
  121.     move.l    12(a4),a1
  122.     move.w    #PMCOMMAND_GETSTATUS,pm_Command(a1)
  123.     jsr    _LVOPutMsg(a6)        ; send a Message to `NUMERICPAD Port'
  124.     jsr    _LVOPermit(a6)
  125.  
  126. wait_l    bsr    get_msg
  127.  
  128.  * You do not ReplyMsg() as you (this port) initiated the Message.
  129.  
  130.     cmp.b    #255,pm_Status(a1)
  131.     bne.s    wait_l
  132.  
  133.  
  134. free_message
  135.     move.l    12(a4),a1
  136.     moveq    #pm_SIZEOF,d0
  137.     jsr    _LVOFreeMem(a6)
  138.  
  139. free_port
  140.     move.l    8(a4),a0
  141.     tst.l    a0
  142.         beq.s    quit
  143.     move.l    4.w,a6
  144.         tst.b    MP_SIGBIT(a0)
  145.         beq.s    no_sig
  146.         jsr    _LVOFreeSignal(a6)
  147. no_sig    move.l    8(a4),a1
  148.         jsr    _LVORemPort(a6)
  149. fr_pmem    move.l    8(a4),a1
  150.         moveq   #MP_SIZE,d0
  151.     move.l    4.w,a6
  152.         jsr    _LVOFreeMem(a6)
  153.  
  154. quit    move.l  #8000000,d0
  155.         moveq    #MEMF_CHIP,d1
  156.     jsr    _LVOAllocMem(a6)
  157.     tst.l    d0
  158.     beq.s    cleanup
  159.     move.l    d0,a1
  160.     move.l    #8000000,d0
  161.     jsr    _LVOFreeMem(a6)
  162. cleanup    tst.l    (a4)
  163.     beq.s    exit            ; Exit - Task was started from CLI.
  164.     jsr    _LVOForbid(a6)
  165.     move.l    (a4),a1            ; Reply to the WB Startup Message and
  166.     jsr    _LVOReplyMsg(a6)    ; Exit - Task was started from WB.
  167. exit    moveq    #0,d0
  168.     rts
  169.  
  170.  
  171.  * Sub-Routines.
  172.  
  173. find_port
  174.     jsr    _LVOForbid(a6)
  175.     lea    otherport(pc),a1
  176.     jsr    _LVOFindPort(a6)    ; Check if `NUMERICPAD Port' exists?
  177.     move.l    d0,d2
  178.     bne.s    fp_end
  179.     jsr    _LVOPermit(a6)
  180. fp_end    rts
  181.  
  182. get_msg    move.l    8(a4),a0
  183.     jsr    _LVOWaitPort(a6)    ; Wait for `NUMERICPAD Port' to reply
  184.     move.l    8(a4),a0
  185.     jsr    _LVOGetMsg(a6)        ; get `NUMERICPAD Port' Message
  186.     move.l    d0,a1
  187.     move.w    pm_Command(a1),16(a4)
  188.     move.w    pm_Action(a1),18(a4)
  189.     move.l    pm_Seconds(a1),20(a4)
  190.     move.l    pm_Micros(a1),24(a4)
  191.     move.b    pm_Data(a1),28(a4)
  192.     move.b    pm_Status(a1),29(a4)
  193.     rts
  194.  
  195.  
  196.  * String Variables.
  197.  
  198. int_name    dc.b    'intuition.library',0
  199. dos_name    dc.b    'dos.library',0
  200. icon_name       dc.b    'icon.library',0,0
  201. portname        dc.b    'KILL NUMERICPAD Port',0,0
  202. otherport    dc.b    'NUMERICPAD Port',0
  203.  
  204.  
  205.  * Buffer Variables.
  206.  
  207. membuf        dcb.b    32,0